#pragma once

// format de fichier facile à écrire et interpréter pour le langage machine 
// orienté mémoire

/***** Cleartext assembly (.asm) *****/

enum asm_Operation 
{
// bits d'interprétation (7:5) (ignorés pour certaines opérandes)
   ADDR_A = 0x80, // 0: adressage absolu 
   ADDR_B = 0x40, // 1: adressage relatif à la base de pile (qui est dans la case 0)
   ADDR_C = 0x20, //
   
// supportés par la machine (3:0)
	ADD	= 0x01,
	MUL	= 0x02,
	SOU	= 0x03,
	DIV	= 0x04,
	COP	= 0x05,
	AFC	= 0x06,
	JMP	= 0x07,
	JMF	= 0x08,
	INF	= 0x09,
	SUP	= 0x0A, 
	EQU	= 0x0B, 
	PRI	= 0x0C,
	STI	= 0x0D, // ptr [a2] <= a1
	LDI	= 0x0E, // a1 <= ptr [a2]
	CPI	= 0x0F, // ptr [a1] <= ptr [a2]

// émulés lors de la compilation
   GTE   = 0x109, //
   LSE   = 0x10A, // NOT (code - 0x100) 
   NEQ   = 0x10B, //
   
   MOD   = 0x200,
};
typedef enum asm_Operation asm_Operation;

struct asm_Op 
{
	const char* name;
	int nbOperand;
};
typedef struct asm_Op asm_Op;

// ! opcode 0 is unused !
static const asm_Op asm_ops[] = {{"", 0}, {"ADD", 3}, {"MUL", 3}, {"SOU", 3}, 
										{"DIV", 3}, {"COP", 2}, {"AFC", 2}, {"JMP", 1},
										{"JMF", 2}, {"INF", 3}, {"SUP", 3}, {"EQU", 3},
										{"PRI", 1}, {"STI", 2}, {"LDI", 2}, {"CPI", 2}};

// including line break
#define ASM_LINE_LEN 19
static const char asm_blank[] = "                  \n";


/***** Binary, Memory-oriented (.bmm) *****/

// note: du bourrage a été ajouté, pour que les instructions occupent toutes
// le même espace, afin de faciliter la leture/écriture.

#define BMM_LINE_LEN 4